//
// Created by YH31 on 2021/6/9.
//

#ifndef CRC_CRC_8_H
#define CRC_CRC_8_H
#include "stdint.h"
uint8_t getMbsBitIndex(uint8_t data);
uint8_t genCRC_8(uint8_t data);
/**
 * 查表法计算 crc
 *  生成多项式：x^8+x^2+x+1
 *  16进制表示：0x07
 *  初始值：0x00
 *  输入输出反转：False
 * @param datas
 * @param len
 * @return
 */
uint8_t crc8(unsigned char * datas, uint16_t len);

uint8_t getStr_CRC_8_1(unsigned char * datas, uint16_t len);
void crc_8_generTable(uint8_t crc);
uint8_t genCRC_temp(uint16_t data);
uint8_t getStrCRC_8_2(unsigned char * datas, uint16_t len);
uint8_t gencrc8_2(uint8_t data);
/**
 * 计算中间值，即后面还有值未计算的
 * @param data
 * @return
 */
uint8_t gencrc8_temp(uint16_t data);



/**
 * 获取CRC/ITU的校验值
 *  生成多项式：x^8+x^2+x+1
    16进制表示：0x07
    初始值：0x00
    结果异或值：0x55
    输入输出反转：False
 * @param datas
 * @param len
 * @return
 */
uint8_t crc8_ITU(unsigned char * datas, uint16_t len);


uint8_t crc8_ROHC_char(unsigned char data);
// 计算中间值，即后面还有值未计算的
uint8_t getcrc8_rohc_temp(uint16_t data);
/**
 * 查表法获取方法字符串的ROHC CRC值
 *  生成表达式：x8 + x2 + x + 1
 *  16进制表示法：0x07
 *  初始值：0xFF  第一个data或者其他开头的crc都要异或上该值
 *  输入输出反转：true
 * @param datas
 * @param len
 * @return
 */
uint8_t crc8_ROHC(unsigned char *datas , uint8_t len);
uint8_t getcrc8_rohc_2(unsigned char *datas , uint8_t len);
uint8_t gencrc8_maxim_temp(uint16_t data);
//生成中间表
void crc_8_generTable_ROHC();



/**
 * 查表法 计算crc8/MAXIM 校验值
 * 生成多项式：
     x8 + x5 + x4 + 1
    16进制表示：0x31
    初始值：0x00
    结果异或值：0x00
    输入输出反转:true
 * @param datas
 * @param len
 * @return
 */
uint8_t crc8_MAXIM(unsigned char * datas, uint8_t len);
uint8_t gencrc8_MAXIM(unsigned char data);
void crc_8_generTable_MAXIM();
uint8_t getcrc8_maxim(unsigned char * datas, uint8_t len);

#endif //CRC_CRC_8_H
